package com.ctgu.springboot.controller;


import cn.hutool.core.io.FileUtil;
import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.crypto.SecureUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.ctgu.springboot.common.QiniuUploadUtils;
import com.ctgu.springboot.common.QueryPageParam;
import com.ctgu.springboot.common.Result;
import com.ctgu.springboot.entity.FormData;
import com.ctgu.springboot.entity.PubResouse;
import com.ctgu.springboot.entity.Student;
import com.ctgu.springboot.entity.SubmitResouse;
import com.ctgu.springboot.mapper.SubmitResouseMapper;
import com.ctgu.springboot.service.StudentService;
import com.ctgu.springboot.service.SubmitResouseService;
import com.ctgu.springboot.service.TeamService;
import org.apache.tomcat.util.http.fileupload.IOUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.net.URLEncoder;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;

/**
 * <p>
 *  前端控制器
 * </p>
 *
 * @author cs
 * @since 2023-07-07
 */
@RestController
@RequestMapping("/submit-resouse")
public class SubmitResouseController {
    @Autowired
    private SubmitResouseService submitResouseService;

    @Autowired
    private SubmitResouseMapper submitResouseMapper;

    @Autowired
    private StudentService studentService;

    @Autowired
    private TeamService teamService;

    @Value("${files.upload.path}")
    private String fileUploadPath;

    //项目提交资源列表
    @RequestMapping("list")
    public List<SubmitResouse> list(){
        return submitResouseService.list();
    }



    //根据团队id查找提交项目资源
    @RequestMapping("teamlist")
    public List<SubmitResouse> teamlist(int team_id){
        QueryWrapper<SubmitResouse> submitResouseQueryWrapper=new QueryWrapper<>();
        submitResouseQueryWrapper.eq("team_id",team_id);
        return submitResouseService.list(submitResouseQueryWrapper);
    }

    //
    //@PostMapping("/upload")
    //public String upload(@RequestParam MultipartFile file) throws IOException {
    //    String originalFilename = file.getOriginalFilename();
    //    String type = FileUtil.extName(originalFilename);
    //    long size = file.getSize();
    //
    //    // 定义一个文件唯一的标识码
    //    String fileUUID = IdUtil.fastSimpleUUID() + StrUtil.DOT + type;
    //
    //    File uploadFile = new File(fileUploadPath + fileUUID);
    //    // 判断配置的文件目录是否存在，若不存在则创建一个新的文件目录
    //    File parentFile = uploadFile.getParentFile();
    //    if(!parentFile.exists()) {
    //        parentFile.mkdirs();
    //    }
    //
    //    String url;
    //    InputStream is = file.getInputStream();
    //    // 获取文件的md5
    //    String md5 = SecureUtil.md5(is);
    //    // 从数据库查询是否存在相同的记录
    //    SubmitResouse dbFiles = getFileByMd5(md5);
    //    if (dbFiles != null) {
    //        url = dbFiles.getUrl();
    //    } else {
    //        // 上传文件到磁盘
    //        file.transferTo(uploadFile);
    //        // 数据库若不存在重复文件，则不删除刚才上传的文件
    //        url = "http://localhost:9090/submit-resouse/" + fileUUID;
    //    }
    //    is.close();
    //
    //    SimpleDateFormat sdf = new SimpleDateFormat();// 格式化时间
    //    sdf.applyPattern("yyyy-MM-dd HH:mm:ss");// a为am/pm的标记
    //    Date date = new Date();// 获取当前时间
    //
    //    PubResouse saveFile = new PubResouse();
    //    saveFile.setPubName(originalFilename);
    //    saveFile.setPubType(type);
    //    saveFile.setPubSize(size/1024+"KB"); // 单位 kb
    //    saveFile.setUrl(url);
    //    saveFile.setMd5(md5);
    //    saveFile.setDownCount(0);
    //    saveFile.setPubTime(sdf.format(date));
    //    pubResouseMapper.insert(saveFile);
    //
    //    return url;
    //}

    //@PostMapping("/upload")
    //public String upload(@RequestParam MultipartFile file, @RequestParam Student student, @RequestParam Date date)throws IOException {
    //    String originalFilename = file.getOriginalFilename();
    //    String type = FileUtil.extName(originalFilename);
    //    long size = file.getSize();
    //
    //    // 定义一个文件唯一的标识码
    //    String fileUUID = IdUtil.fastSimpleUUID() + StrUtil.DOT + type;
    //
    //    File uploadFile = new File(fileUploadPath + fileUUID);
    //    // 判断配置的文件目录是否存在，若不存在则创建一个新的文件目录
    //    File parentFile = uploadFile.getParentFile();
    //    if(!parentFile.exists()) {
    //        parentFile.mkdirs();
    //    }
    //
    //    String url;
    //    InputStream is = file.getInputStream();
    //    // 获取文件的md5
    //    String md5 = SecureUtil.md5(is);
    //    // 从数据库查询是否存在相同的记录
    //    SubmitResouse dbFiles = getFileByMd5(md5);
    //    if (dbFiles != null) {
    //        url = dbFiles.getUrl();
    //    } else {
    //        // 上传文件到磁盘
    //        file.transferTo(uploadFile);
    //        // 数据库若不存在重复文件，则不删除刚才上传的文件
    //        url = "http://localhost:9090/submit-resouse/" + fileUUID;
    //    }
    //    is.close();
    //
    //    SubmitResouse saveFile = new SubmitResouse();
    //    saveFile.setSubName(originalFilename);
    //    saveFile.setSubSize(size/1024); // 单位 kb
    //    saveFile.setUrl(url);
    //    saveFile.setStuName(student.getStuName());
    //    saveFile.setMd5(md5);
    //    saveFile.setTeamName(studentService.getTeamName(student.getStuId()));
    //    submitResouseMapper.insert(saveFile);
    //
    //    return url;
    //}

    //@PostMapping("/upload")
    //public String upload(FormData formData)throws IOException {
    //    String originalFilename = formData.getFile().getOriginalFilename();
    //    String type = FileUtil.extName(originalFilename);
    //    long size = formData.getFile().getSize();
    //
    //    // 定义一个文件唯一的标识码
    //    String fileUUID = IdUtil.fastSimpleUUID() + StrUtil.DOT + type;
    //
    //    File uploadFile = new File(fileUploadPath + fileUUID);
    //    // 判断配置的文件目录是否存在，若不存在则创建一个新的文件目录
    //    File parentFile = uploadFile.getParentFile();
    //    if(!parentFile.exists()) {
    //        parentFile.mkdirs();
    //    }

    //    String url;
    //    InputStream is = formData.getFile().getInputStream();
    //    // 获取文件的md5
    //    String md5 = SecureUtil.md5(is);
    //    // 从数据库查询是否存在相同的记录
    //    SubmitResouse dbFiles = getFileByMd5(md5);
    //    if (dbFiles != null) {
    //        url = dbFiles.getUrl();
    //    } else {
    //        // 上传文件到磁盘
    //        formData.getFile().transferTo(uploadFile);
    //        // 数据库若不存在重复文件，则不删除刚才上传的文件
    //        url = "http://localhost:9090/submit-resouse/" + fileUUID;
    //    }
    //    is.close();
    //
    //    SimpleDateFormat sdf = new SimpleDateFormat();// 格式化时间
    //    sdf.applyPattern("yyyy-MM-dd HH:mm:ss");// a为am/pm的标记
    //    Date date = new Date();// 获取当前时间
    //    System.out.println("现在时间：" + sdf.format(date)); // 输出已经格式化的现在时间（24小时制）
    //
    //    SubmitResouse saveFile = new SubmitResouse();
    //    saveFile.setSubName(originalFilename);
    //    saveFile.setSubSize(size/1024); // 单位 kb
    //    saveFile.setUrl(url);
    //    saveFile.setStuName(formData.getStu_name());
    //    saveFile.setMd5(md5);
    //    saveFile.setTeamName(studentService.getTeam(formData.getStu_name()));
    //    saveFile.setSubTime(sdf.format(date));
    //    submitResouseMapper.insert(saveFile);
    //
    //    return url;
    //}

    /**
     * 文件上传函数，上传到七牛云返回新文件名
     * @param file
     * @return fileUUID
     */
    @PostMapping("upload")
    public Result upload(MultipartFile file){
        System.out.println("file = "+file);
        String Filename = file.getOriginalFilename();
        System.out.println("Filename = "+Filename);
        return QiniuUploadUtils.upload(file);
    }

    /**
     * 下载接口，通过传文件名下载
     * @param fileUUID
     * @param response
     * @throws IOException
     */
    @GetMapping("/{fileUUID}")
    public void download(@PathVariable String fileUUID, HttpServletResponse response) throws IOException {

        String fileUrl = "http://rxs1e2bv8.hn-bkt.clouddn.com/"+fileUUID;
        String downUrl = "http://150.158.87.29:9090/submit-resouse/"+fileUUID;
        SubmitResouse submitResouse = submitResouseService.selectByUrl(downUrl);
        submitResouse.setDownCount(submitResouse.getDownCount()+1);
        submitResouseService.updateById(submitResouse);
        URL url = new URL(fileUrl);
        InputStream is = url.openStream();
        response.setContentType("application/octet-stream");
        response.setHeader("Content-Disposition", "attachment; filename="+URLEncoder.encode(fileUUID, "UTF-8"));
        IOUtils.copy(is, response.getOutputStream());
        response.flushBuffer();
    }

    //@GetMapping("/{fileUUID}")
    //public void download(@PathVariable String fileUUID, HttpServletResponse response) throws IOException {
    //
    //    String searchUrl = "http://localhost:9090/resource/" + fileUUID;
    //    String fileUrl = "http://rxs1e2bv8.hn-bkt.clouddn.com/"+fileUUID;
    //    PubResouse pubResouse = pubResouseService.selectByUrl(searchUrl);
    //    pubResouse.setDownCount(pubResouse.getDownCount()+1);
    //    pubResouseService.updateById(pubResouse);
    //    URL url = new URL(fileUrl);
    //    InputStream is = url.openStream();
    //    response.setContentType("application/octet-stream");
    //    response.setHeader("Content-Disposition", "attachment; filename="+URLEncoder.encode(fileUUID, "UTF-8"));
    //    IOUtils.copy(is, response.getOutputStream());
    //    response.flushBuffer();
    //}

    /**
     * 上传文件之后在数据中插入记录
     * @param
     * @return
     */
    @GetMapping("insert")
    public Result insertRecord(@RequestParam Integer stu_id, @RequestParam String originalFilename, @RequestParam String fileUUID){
        System.out.println(stu_id);
        System.out.println(originalFilename);
        System.out.println(fileUUID);
        String url = "http://150.158.87.29:9090/submit-resouse/";
        SimpleDateFormat sdf = new SimpleDateFormat();// 格式化时间
        sdf.applyPattern("yyyy-MM-dd HH:mm:ss");// a为am/pm的标记
        Date date = new Date();// 获取当前时间
        System.out.println("现在时间：" + sdf.format(date)); // 输出已经格式化的现在时间（24小时制）

        SubmitResouse saveFile = new SubmitResouse();
        saveFile.setSubName(originalFilename);// 单位 kb
        saveFile.setUrl(url + fileUUID);
        saveFile.setStuName(studentService.getById(stu_id).getStuName());
        saveFile.setTeamName(teamService.getById(studentService.getById(stu_id).getTeamId()).getTeamName());
        saveFile.setSubTime(sdf.format(date));
        saveFile.setDownCount(0);
        return (submitResouseMapper.insert(saveFile)==1)?Result.suc():Result.fail();
    }

    @PostMapping("/listPage")
    public Result listPage(@RequestBody QueryPageParam query){
        IPage<SubmitResouse> result = submitResouseService.listPage(query);
        return Result.suc(result.getRecords(), result.getTotal());
    }

    @GetMapping("/getUrl")
    public Result getUrl(@RequestParam Integer sub_id){
        return (submitResouseService.getById(sub_id).getUrl()!=null)? Result.suc(submitResouseService.getById(sub_id).getUrl()):Result.fail();
    }

    @GetMapping("select")
    public SubmitResouse select(@RequestParam String url){
        return submitResouseService.selectByUrl(url);
    }

    @GetMapping("/del")
    public Result getById(@RequestParam Integer sub_id) {
        return submitResouseService.removeById(sub_id)?Result.suc():Result.fail();
    }

}
